package main

import (
	"fmt"
	"strconv"
	"strings"
)

// 作业一：阶乘循环方式
//
//	@Description: 阶乘循环方式
//	@param num
//	@return int
func jie(num int) int {
	var tmp = 1
	for i := 2; i <= num; i++ {
		tmp = tmp * i
	}
	return tmp
}

// 作业一：阶乘递归方式
//
//	@Description:
//	@param num
//	@param n  1
//	@param x  1
//	@return int
func jie2(num, n, x int) int {
	n++
	x = x * n
	if num == 2 {
		return x
	}
	return jie2(num-1, n, x)
}

//	 作业二：生成上三角形
//		@Description: 编写一个函数，接受一个参数n，n为正整数。要求数字必须对齐
//		@param 给定一个参数n
func triangle(num int) {
	if num <= 0 {
		fmt.Println("参数必须为正整数")
		return
	}
	//  获取给定数字的长度，+1 是为了不管长度是多少的数字，中间都有间隔
	lens := len(strconv.Itoa(num)) + 1
	for i := 1; i <= num; i++ {
		// 获取每行对应的空格数，用(num-i)*lens 动态获取每行的空格
		spaces := strings.Repeat(" ", (num-i)*lens)
		for y := i; y >= 1; y-- {
			// 获取每行的数字，转换成字符串
			l := strconv.Itoa(y)
			// 设置每个字符串的宽度 * 动态设置
			m := fmt.Sprintf("%*s", lens, l)
			// 将空格和设置好的字符拼接
			spaces += m
		}
		fmt.Println(spaces)
	}
}
func main() {

	// 作业一，循环方式
	m := jie(5) // 1x2x3x4x5 =
	fmt.Println(m)
	// 作业二，递归方式
	c := jie2(2, 1, 1)
	fmt.Println(c)

	// 作业二
	triangle(16)

}

// 批改意见
// 1. 阶乘没有考虑0!和1!的特殊情况